<?php

/**
 * マイページのメソッド集合クラス
 *
 * @package Apm
 * @author K.Ikenaga
 * @since 2010/11/05
 */
class Apm_Otheritems
{

    /**
     * 動作環境に合わせて呼び出すAPIのURLを変更する
     */
    // renewvm環境用
    // const API_BASE_URL = "http://localhost/";
    // 本番環境用
    // const API_BASE_URL = "http://www.apamanshop.com/";

    /**
     * メール送信EXのfromキー
     * ※値はKey-Valueで、Keyがメールアドレス(必須)、Valueが名前
     */
    const SEND_MAIL_EX_FROM_KEY = "from";

    /**
     * メール送信EXのtoキー
     * ※値はKey-Valueで、Keyがメールアドレス(必須)、Valueが名前)
     */
    const SEND_MAIL_EX_TO_KEY = "to";

    /**
     * メール送信EXのccキー
     * ※値はKey-Valueで、Keyがメールアドレス(必須)、Valueが名前)
     */
    const SEND_MAIL_EX_CC_KEY = "cc";

    /**
     * メール送信EXのbccキー
     * ※値はKey-Valueで、Keyがメールアドレス(必須)、Valueが名前)
     */
    const SEND_MAIL_EX_BCC_KEY = "bcc";

    /**
     * メール送信EXのreply-toキー
     * ※値はKey-Valueで、Keyがメールアドレス(必須)、Valueが名前
     * ※一応配列だけど、reply-toは１つだけなので、最後尾のが入る
     */
    const SEND_MAIL_EX_REPLY_TO_KEY = "reply-to";

    /**
     * メール送信EXのheaderキー
     * ※値はKey-Valueで、Keyが名前(必須)、Valueが値
     * ※同じ名前で複数設定も可能なはずなので、key-valueでなくどうにかしたほうがよいかも
     */
    const SEND_MAIL_EX_HEADER_KEY = "header";

    /**
     * メール送信EXのsubjectキー
     * ※値は文字列
     */
    const SEND_MAIL_EX_SUBJECT_KEY = "subject";

    /**
     * メール送信EXのbodyキー
     * ※値は文字列
     */
    const SEND_MAIL_EX_BODY_KEY = "body";

    /**
     * 文字列がNullもしくは空(空白のみも空とする)であるか確認
     *
     * @param string $val
     *            文字列
     * @return boolean true:空 false:空でない
     */
    public static function IsNullOrEmpty($val)
    {
        if (is_null($val))
        {
            return true;
        }
        if (strcmp(trim($val), '') == 0)
        {
            return true;
        }
        return false;
    }

    /**
     * メール送信
     *
     * @param string $toAddress
     *            Toメールアドレス
     * @param string $fromAddress
     *            Fromメールアドレス
     * @param string $subject
     *            件名
     * @param string $body
     *            本文
     * @return boolean true：成功 false：失敗
     */
    public static function SendMail($toAddress, $fromAddress, $subject, $body)
    {
        // SMTPサーバ設定
        $tr = new Zend_Mail_Transport_Smtp(Apm_Config_Mail::MAIL_SEND_SERVER);

        Zend_Mail::setDefaultTransport($tr);

        $mail = new Zend_Mail('ISO-2022-JP');

        $mail->setFrom($fromAddress);

        $mail->addTo($toAddress, '');

        // 文字コードを定数化
        // $mail->setSubject(mb_convert_encoding($subject, 'JIS', 'SJIS'));
        // $mail->setBodyText(mb_convert_encoding($body, 'JIS', 'SJIS'));
        $mail->setSubject(mb_convert_encoding($subject, Apm_Config_Common::MAIL_CHAR_SET, Apm_Config_Common::PHP_CHAR_SET));
        $mail->setBodyText(mb_convert_encoding($body, Apm_Config_Common::MAIL_CHAR_SET, Apm_Config_Common::PHP_CHAR_SET));

        $mail->send();

        // 一応SMTPサーバクリアーしておく
        Zend_Mail::clearDefaultTransport();

        return true;
    }

    /**
     * メール送信
     *
     * @param string $params
     *            送信に必要なパラメータ
     * @return boolean true：成功 false：失敗
     */
    public static function SendMailEx($params)
    {
        // 必須キーチェック
        if (!array_key_exists(Apm_Otheritems::SEND_MAIL_EX_FROM_KEY, $params))
        {
            __log_debug(__FILE__, __LINE__, __METHOD__, Apm_Otheritems::SEND_MAIL_EX_FROM_KEY . "がありません");
            return false;
        }
        if (!array_key_exists(Apm_Otheritems::SEND_MAIL_EX_TO_KEY, $params))
        {
            __log_debug(__FILE__, __LINE__, __METHOD__, Apm_Otheritems::SEND_MAIL_EX_TO_KEY . "がありません");
            return false;
        }
        if (!array_key_exists(Apm_Otheritems::SEND_MAIL_EX_SUBJECT_KEY, $params))
        {
            __log_debug(__FILE__, __LINE__, __METHOD__, Apm_Otheritems::SEND_MAIL_EX_SUBJECT_KEY . "がありません");
            return false;
        }
        if (!array_key_exists(Apm_Otheritems::SEND_MAIL_EX_BODY_KEY, $params))
        {
            __log_debug(__FILE__, __LINE__, __METHOD__, Apm_Otheritems::SEND_MAIL_EX_BODY_KEY . "がありません");
            return false;
        }

        if (true)
        {
            $msg = "\n=========================メール送信EX=========================\n";
            foreach ($params as $key => $value)
            {
                switch ($key)
                {
                    case Apm_Otheritems::SEND_MAIL_EX_FROM_KEY:
                        $msg .= "===============FROM===============\n";
                        foreach ($value as $address => $name)
                        {
                            $msg .= "[" . $address . "]" . $name . "\n";
                        }
                        break;

                    case Apm_Otheritems::SEND_MAIL_EX_TO_KEY:
                        $msg .= "===============TO===============\n";
                        foreach ($value as $address => $name)
                        {
                            $msg .= "[" . $address . "]" . $name . "\n";
                        }
                        break;

                    case Apm_Otheritems::SEND_MAIL_EX_CC_KEY:
                        $msg .= "===============CC===============\n";
                        foreach ($value as $address => $name)
                        {
                            $msg .= "[" . $address . "]" . $name . "\n";
                        }
                        break;

                    case Apm_Otheritems::SEND_MAIL_EX_BCC_KEY:
                        $msg .= "===============BCC===============\n";
                        foreach ($value as $address => $name)
                        {
                            $msg .= "[" . $address . "]" . $name . "\n";
                        }
                        break;

                    case Apm_Otheritems::SEND_MAIL_EX_REPLY_TO_KEY:
                        $msg .= "===============REPLY-TO===============\n";
                        foreach ($value as $address => $name)
                        {
                            $msg .= "[" . $address . "]" . $name . "\n";
                        }
                        break;

                    case Apm_Otheritems::SEND_MAIL_EX_HEADER_KEY:
                        $msg .= "===============HEADER===============\n";
                        foreach ($value as $hName => $hValue)
                        {
                            $msg .= "[" . $hName . "]" . $hValue . "\n";
                        }
                        break;

                    case Apm_Otheritems::SEND_MAIL_EX_SUBJECT_KEY:
                        $msg .= "===============SUBJECT===============\n";
                        $msg .= $value . "\n";
                        break;

                    case Apm_Otheritems::SEND_MAIL_EX_BODY_KEY:
                        $msg .= "===============BODY===============\n";
                        $msg .= $value . "\n";
                        break;
                }
            }
            __log_debug(__FILE__, __LINE__, __METHOD__, $msg);
        }

        // SMTPサーバ設定
        $tr = new Zend_Mail_Transport_Smtp(Apm_Config_Mail::MAIL_SEND_SERVER);

        Zend_Mail::setDefaultTransport($tr);

        $mail = new Zend_Mail('ISO-2022-JP');

        foreach ($params as $key => $value)
        {
            switch ($key)
            {
                case Apm_Otheritems::SEND_MAIL_EX_FROM_KEY:
                    // from設定
                    foreach ($value as $address => $name)
                    {
                        $mail->setFrom($address, $name);
                    }
                    break;

                case Apm_Otheritems::SEND_MAIL_EX_TO_KEY:
                    // to設定
                    foreach ($value as $address => $name)
                    {
                        $mail->addTo($address, $name);
                    }
                    break;

                case Apm_Otheritems::SEND_MAIL_EX_CC_KEY:
                    // cc設定
                    foreach ($value as $address => $name)
                    {
                        $mail->addCc($address, $name);
                    }
                    break;

                case Apm_Otheritems::SEND_MAIL_EX_BCC_KEY:
                    // cc設定
                    foreach ($value as $address => $name)
                    {
                        $mail->addBcc($address, $name);
                    }
                    break;

                case Apm_Otheritems::SEND_MAIL_EX_REPLY_TO_KEY:
                    // reply-to設定
                    foreach ($value as $address => $name)
                    {
                        $mail->setReplyTo($address, $name);
                    }
                    break;

                case Apm_Otheritems::SEND_MAIL_EX_HEADER_KEY:
                    // ヘッダー設定
                    foreach ($value as $hName => $hValue)
                    {
                        $mail->addHeader($hName, $hValue, true);
                    }
                    break;

                case Apm_Otheritems::SEND_MAIL_EX_SUBJECT_KEY:
                    // 件名設定
                    // 文字コードを定数化
                    // $mail->setSubject(mb_convert_encoding($value, 'JIS', 'SJIS'));
                    $mail->setSubject(mb_convert_encoding($value, Apm_Config_Common::MAIL_CHAR_SET, Apm_Config_Common::PHP_CHAR_SET));
                    break;

                case Apm_Otheritems::SEND_MAIL_EX_BODY_KEY:
                    // 本文設定
                    // 文字コードを定数化
                    // $mail->setBodyText(mb_convert_encoding($value, 'JIS', 'SJIS'));
                    $mail->setBodyText(mb_convert_encoding($value, Apm_Config_Common::MAIL_CHAR_SET, Apm_Config_Common::PHP_CHAR_SET));
                    // error_log($value);
                    break;
            }
        }

        $mail->send();

        // 一応SMTPサーバクリアーしておく
        Zend_Mail::clearDefaultTransport();

        return true;
    }

    /**
     * 携帯メールアドレス判定
     *
     * @param string $address
     *            メールアドレス
     * @return boolean true：携帯メールアドレス false：携帯以外メールアドレス
     */
    public static function CheckMobileAddress($mailAddress)
    {
        // ここで定義でなくて、何かしらうまい方法がありそうな気がするんだが。。。
        $mobileDomain = array(
            'em.nttpnet.ne.jp',
            'pipopa.ne.jp',
            'docomo.ne.jp',
            'softbank.ne.jp',
            'ezweb.ne.jp',
            'sky.tu-ka.ne.jp',
            'sky.tkk.ne.jp',
            'sky.tkc.ne.jp',
            't.vodafone.ne.jp',
            'k.vodafone.ne.jp',
            'd.vodafone.ne.jp',
            'h.vodafone.ne.jp',
            'c.vodafone.ne.jp',
            'r.vodafone.ne.jp',
            'n.vodafone.ne.jp',
            's.vodafone.ne.jp',
            'q.vodafone.ne.jp',
            'jp-d.ne.jp',
            'jp-h.ne.jp',
            'jp-t.ne.jp',
            'jp-k.ne.jp',
            'jp-r.ne.jp',
            'jp-s.ne.jp',
            'jp-n.ne.jp',
            'jp-q.ne.jp',
            'jp-c.ne.jp',
            't2.ezweb.ne.jp',
            't3.ezweb.ne.jp',
            't4.ezweb.ne.jp',
            't5.ezweb.ne.jp',
            't6.ezweb.ne.jp',
            't7.ezweb.ne.jp',
            't8.ezweb.ne.jp',
            't9.ezweb.ne.jp',
            'pdx.ne.jp',
            'dk.pdx.ne.jp',
            'di.pdx.ne.jp',
            'dj.pdx.ne.jp',
            'wm.pdx.ne.jp',
            'bandai.jp'
        );

        $result = false;
        foreach ($mobileDomain as $key => $value)
        {
            $pattern = '@' . $value;
            $match = ereg($pattern, $mailAddress);
            if ($match)
            {
                $result = true;
                break;
            }
        }
        return $result;
    }

    /**
     * 全てのGetPostパラメタをチェック(SQLインジェクションやＣＳＳを防止)
     *
     * @param string $value
     *            チェック対象文字列
     * @return true：問題なし false：問題あり
     */
    public function IsValidSecureValue($value)
    {
        $result = true;

        $invalids = array(
            '?',
            '&',
            '%',
            ';',
            '\'',
            '--',
            '<',
            '>'
        );
        $invalid = null;

        foreach ($invalids as $invalid)
        {
            if (strpos($value, $invalid) !== false)
            {
                $result = false;
                break;
            }
        }

        return $result;
    }

    /**
     * 全てのGetPostパラメタをチェック(SQLインジェクションやＣＳＳを防止)
     *
     * @param array $params
     *            チェック対象パラメータ格納配列
     * @return true：問題なし false：問題あり
     */
    public function IsValidSecureParams($params)
    {
        $result = true;

        $invalids = array(
            '?',
            '&',
            '%',
            ';',
            '\'',
            '--',
            '<',
            '>'
        );
        $invalid = null;
        $value = null;

        foreach ($invalids as $invalid)
        {
            foreach ($params as $value)
            {
                if (strpos($value, $invalid) !== false)
                {
                    $result = false;
                    break;
                }
            }
            if (!$result)
            {
                break;
            }
        }

        return $result;
    }

    /**
     * エラーコードからメッセージを取得
     *
     * @param String $str
     *            エラーコード, string $userCd ユーザコード(M92_USER_CD), string $UID メールアドレス(M92_UID)
     * @return String $strMsg メッセージ
     */
    public function getResMessage($str, $userCd = "", $UID = "")
    {
        $strMsg = "";

        switch ($str)
        {
            case "0000":
                // お気に入り物件登録
                $strMsg = "登録しました";
                break;
            case "0001":
                // お気に入り物件削除
                $strMsg = "削除しました";
                break;
            case "0002":
                // マイページアカウント登録
                $strMsg = "完了";
                break;
            case "0003":
                // マイページアカウント更新
                $strMsg = "更新";
                break;
            case "0004":
                // 検索条件登録
                $strMsg = "この検索条件をマイページに登録しました。";
                break;
            case "0005":
                // 検索条件削除
                $strMsg = "削除しました";
                break;
            case "0006":
                // 退会処理
                $strMsg = "退会手続きを完了しました";
                break;
                break;
            case "9900":
                // お気に入り物件登録
                $strMsg = "この物件情報は既にお気に入りに登録されています";
                break;
            case "9901":
                // お気に入り物件登録
                $strMsg = "上限";
                break;
            case "9902":
                // お気に入り物件登録
                $strMsg = "登録失敗しました";
                break;
            case "9903":
                // お気に入り物件削除
                $strMsg = "削除失敗しました";
                break;
            case "9904":
                // マイページアカウント登録
                $strMsg = $userCd . "完了に失敗しました。";
                break;
            case "9905":
                // マイページアカウント更新
                $strMsg = $UID . "は既に登録されています。";
                break;
            case "9906":
                // マイページアカウント更新
                $strMsg = "更新に失敗しました。";
                break;
            case "9907":
                // 検索条件登録
                $strMsg = "条件登録に失敗しました。";
                break;
            case "9908":
                // 検索条件削除
                $strMsg = "削除に失敗しました";
                break;
            case "9909":
                // 退会処理
                $strMsg = "退会手続きに失敗しました";
                break;
        }

        return $strMsg;
    }

}
